package com.sh.demo.qa.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Random;
import java.util.UUID;
import javax.servlet.http.HttpServletResponse;

public class FileUtils {

	/**
	 * 读取单个文本文件内容
	 * @param is
	 * @param fileName
	 * @return
	 * @throws IOException 
	 */
	public static FileBean readFile(InputStream is, String fileName) throws IOException{
		// 获得文件扩展名
        String fileExtname = getExtName(fileName);
		// 获得内容
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		StringBuffer content = new StringBuffer();
		String buffer;
		while((buffer = br.readLine()) != null){
			content.append(buffer + "\r\n");
		}
		br.close();
		isr.close();
		is.close();
		// 结果
		FileBean result = new FileBean();
		result.setName(fileName);
        result.setExt(fileExtname);
        result.setContent(content.toString());
		return result;
	}
	
    /**
     * 上传单个文件
     * @param is
     * @param path 比如：c:/upload
     * @param fileName
     * @return
     */
    public static FileBean uploadFile(InputStream is, String path, String fileName) throws IOException {
        // 生成随机文件名
        String rondomFileName = getRondomFileName(fileName);
        // 获得文件扩展名
        String fileExtname = getExtName(fileName);
        // 生成随机多级文件夹
        String rondomFolderPath = getRondomFolderPath();
        // 目标目录
        File targetFolder = new File(path + rondomFolderPath);
        // 创建目标目录
        if (!targetFolder.exists())
            // 创建多级目录
            targetFolder.mkdirs();
        // 目标文件的硬盘路径
        String filePath = targetFolder + File.separator + rondomFileName;
        // 目标文件的相对路径
        String relativePath = rondomFolderPath + File.separator + rondomFileName;
        // 文件写到硬盘
        FileOutputStream os = new FileOutputStream(filePath);
        outPutFile(is, os);
        FileBean result = new FileBean();
        // 原始文件名
        result.setName(fileName);
        result.setExt(fileExtname);
        result.setPath(relativePath);
        return result;
    }

    /**
     * 删除单个硬盘文件
     */
    public static void deleteFile(String path, FileBean fileBean) {
        String relativePath = fileBean.getPath();
        if (relativePath != null && !"".equals(relativePath.trim())) {
            File file = new File(path + relativePath);
            file.delete();
        }
    }

    /**
     * 下载单个文件（输出完应当结束响应，再进行操作会出错）
     * @param response
     * @param fileName 原文件名
     * @param filePath 文件在硬盘上的真实路径
     * @param lang 下载支持的编码
     */
    public static void downFile(HttpServletResponse response,
            String fileName, String filePath, String encode) throws IOException {

        // 设置下载信息
        response.setContentType("application/octet-stream"); // MIME 未知文件类型
        response.setHeader("Content-disposition", "attachment;filename="+ new String(fileName.getBytes(encode), "ISO-8859-1"));

        // 需要配置完响应才流输出
        InputStream is = new FileInputStream(filePath);
        OutputStream os = response.getOutputStream();
        outPutFile(is, os);
    }

    /**
     * 输出文件
     * @param is
     * @param path
     * @param filename
     * @throws IOException
     */
    public static void outPutFile(InputStream is, OutputStream os) throws IOException {
        byte[] buffer = new byte[10240];
        int byteRead = 0;
        while ((byteRead = is.read(buffer, 0, buffer.length)) != -1) {
            os.write(buffer, 0, byteRead);
            os.flush();
        }
        os.close();
        is.close();
    }

    /**
     * 生随机文件名（扩展名只转小写其他未修改）
     * @param oldFileName
     * @return 随机文件名
     */
    public static String getRondomFileName(String oldFileName) {

        String prefixName = UUID.randomUUID().toString(); // 前缀名
        String extName = getExtName(oldFileName); // 扩展名
        String newFileName = null;
        // 是否有扩展名
        if (extName != null) {
            newFileName = prefixName + "." + extName;
        } else {
            newFileName = prefixName;
        }
        return newFileName;
    }

    /**
     * 获得原文件的扩展名（没有处理前后空格）
     * @param path
     * @return 有 - 不带点的扩展名名称；没有 - 空
     */
    public static String getExtName(String fileName) {
        int index = fileName.lastIndexOf(".");
        // 是否有扩展名
        if (index != -1) {
            return fileName.substring(index + 1).toLowerCase(); // 不带点的扩展名小写名称
        } else {
            return null;
        }
    }

    /**
     * 生成随机文件夹路径
     * @return 随机文件夹路径
     */
    public static String getRondomFolderPath() {
        StringBuilder rondomFolderPath = new StringBuilder();
        // 创建多级文件夹
        for (int i = 0; i < 3; i++) {
            rondomFolderPath.append(File.separator + String.valueOf(new Random().nextInt(10)));
        }
        return rondomFolderPath.toString();
    }

}
